# 1. откроем файл с содержимым веб-страницы
import re
from pprint import pprint

with open(r"blank\index.html", encoding="utf-8") as file:
    src = file.read()
# print(src)
# 2. импортируем объект BeatifulSoup из библиотеки
from bs4 import BeautifulSoup


# 3. создадим объект класса BeautifulSoup
# 'lxml' - название парсера (самый быстрый парсер)
# установка парсера lxml: pip install lxml
soup = BeautifulSoup(src, 'lxml')
# 4. Выведем содержимое тэга title (название страницы)
title = soup.title
# print(title)
# получим содержимое тэга title
# print(title.text)
# print(title.string)
# 5. методы .find() и .find_all()
# метод .find()
# page_h1 = soup.find("h1")
# print(page_h1)
# метод .find_all()
# page_all_h1 = soup.find_all("h1")
# print(page_all_h1)
# перебираем список найденного в цикле
# for item in page_all_h1:
#     print(item.text)
# 6. Найдём информацию о пользователе на странице
# user_name = soup.find("div", class_="user__name")
# в итоге мы получим блок кода целиком
# print(user_name)
# извлекаем текстовое содержимое из блока при помощи метода .text
# strip() убирает пробелы слева и справа
# print(user_name.text.strip())
# рассмотрим другой способ получения информации о пользователе
# user_name = soup.find("div", class_="user__name").find("span").text
# print(user_name)
# 7. Второй способ фильтрации поиска - передача словаря
# в словаре с помощью пары "ключ": "значение" указываются параметры отбора
# user_name = soup.find("div", {"class": "user__name"}).find(
#     "span").text
# print(user_name)
# user_name = soup.find("div", {"class": "user__name",
#                                           "id": "aaa"}).find(
#     "span").text
# print(user_name)
# 8. Соберём все тэги с класса "user__info" при помощи функции find_all()
# find_all_spans_in_user_info = soup.find(class_="user__info").find_all("span")
# pprint(find_all_spans_in_user_info)
# по списку можно пройтись циклом и извлечь текстовую информацию
# for item in find_all_spans_in_user_info:
#     print(item.text)
# можно обратиться к конкретному элементу по его индексу
# print(find_all_spans_in_user_info[0].text)
# print(find_all_spans_in_user_info[2].text)
# 9. Найдём все соцсети пользователя
# 1 Способ: найдём класс "social__networks", внутри него ищем "ul",
# внутри "ul" ищем все "а"
# social_links = soup.find(class_="social__networks").find("ul").find_all("a")
# выведем результат в консоль
# print(social_links)
# 2 Способ: воспользоваться методом find_all()
all_a = soup.find_all("a")
# print(all_a)
# извлечём из списка ссылку и её описание
# for item in all_a:
    # так как ссылка всегда содержится в аттрибуте "href",
    # то мы можем извлечь её при помощи метода get()
    # item_url = item.get("href")
    # print(item_url)
    # добавим к ссылкам описание при помощи метода .text
    # item_text = item.text
    # item_url = item.get("href")
    # print(f"{item_text}: {item_url}")
# 10. Методы для перемещения по DOM-дереву страницы
# post_div = soup.find(class_="post__text").find_parent()
# print(post_div)
# можно передать параметры в find_parent()
# получим название статьи на странице при помощи div c классом "post__title"
# next_el = soup.find(class_="post__title").next_element.next_element.text
# print(next_el)
# похожим поведением обладает функция find_next()
# next_el = soup.find(class_="post__title").find_next().text
# print(next_el)
# find_next_sibling()  и find_previous_sibling()
# применим find_next_sibling() к классу "post__title"
# next_sib = soup.find(class_="post__title").find_next_sibling()
# print(next_sib)
# prev_sib = soup.find(class_="post__date").find_previous_sibling()
# print(prev_sib)
# 11 Комбинация методов между собой
# post_title = soup.find(class_="post__date").find_previous_sibling().find_next().text
# print(post_title)
# links = soup.find(class_="some__links").find_all("a")
# print(links)
# for link in links:
#     link_href_attr = link.get("href")
#     link_data_attr = link.get("data-attr")
#     print(link_href_attr)
#     print(link_data_attr)
# Найдём ссылку с аттрибуты одежды
# find_a_by_text = soup.find("a", string="Одежда")
# print(find_a_by_text)
# find_a_by_text = soup.find("a", string="Одежда для взрослых")
# print(find_a_by_text)
# Найдём ссылку с аттрибутами одежды при помощи регулярного выражения
find_a_by_text = soup.find("a", string=re.compile("Одежда"))
print(find_a_by_text)
# найдём все тэги, в названии которых есть слово "Одежда":
find_all_clothes = soup.find_all(string=re.compile("[Оо]дежда"))
print(find_all_clothes)